﻿//using System;
//using Wizard.Source;
//using System.Collections.Generic;

//namespace Wizard.Runtime
//{
//    [Statement("Method File runtime instance.")]
//    public class MethodInvoker
//    {
//        public readonly IMethodSource MethodSource;
//        private object[] mValues;
//        private bool[] mIsValueSet;
//        private bool mParametersChecked;

//        public MethodInvoker(IMethodSource source)
//        {
//            MethodSource = source;
//            int count = MethodSource.Parameters.Count;
//            mValues = new object[count];
//            mIsValueSet = new bool[count];
                            
//        }

//        public void CheckParameters()
//        {
//            if (!mParametersChecked)
//            {
//                for (int index = 0; index < mValues.Length; index++)
//                {
//                    if (!mIsValueSet[index])
//                    {
//                        var p = MethodSource.Parameters.GetItem(index);
//                        if (p.Optional)
//                        {
//                            mValues[index] = p.DefaultValue;
//                        }
//                        else throw new Exception(string.Format("Parameter {0} is not set.", MethodSource.Parameters.GetItem(index).Name));
//                    }
//                }
//                mParametersChecked = true;
//            }
//        }

//        public ThreadStep StepInto(IClassInstance classA1)
//        {
//            if (classA1.Session.Engine!=this.MethodSource.Engine)
//                throw new Exception("Application mismatch in MethodInvoker.StepInto");
//            CheckParameters();
//            var thread = new Runtime.Thread(classA1, MethodSource);
//            return thread.Current;
//        }

//        public void SetParameter(int index, object value)
//        {
//            IMethodParameter parameter = MethodSource.Parameters.GetItem(index);
//            if (mIsValueSet[index])
//                throw new Exception(string.Format("Parameter {0} already set previously.", MethodSource.Parameters.GetItem(index).Name));

//            if (value==null)
//            {
//                if (!parameter.Nullable)
//                    throw new Exception(string.Format("Parameter {0} cannot be set to {1}.", MethodSource.Parameters.GetItem(index).Name, "null"));
//            }
//            else
//            {
//                var valueType = value.GetType();
//                if (!parameter.Type.IsAssignableFrom(valueType))
//                    throw new Exception(string.Format("Parameter {0} is a {1} and not a {2}.", MethodSource.Parameters.GetItem(index).Name, parameter.Type.Name, valueType.Name));
//            }
//            //todo:check the type
//            mValues[index] = value;
//            mIsValueSet[index] = true;
//        }

//        public void SetParameter(string name, object value)
//        {
//            int idx = MethodSource.Parameters.IndexOf(name);
//            SetParameter(idx, value);
//        }
//    }
//}